#ifndef __MICRORTOS_H__
#define __MICRORTOS_H__

#include "microThread_config.h"

#ifdef __cplusplus
extern "C" {
#endif

/* 版本定义*/
#define MT_VERSION         0L           /* 主版本 */
#define MT_SUBVERSION      0L           /* 次版本 */
#define MT_REVISION        1L           /* 修订号 */
#define MT_VERSION_STR     "0.0.1"

/* 基础数据类型定义 */
typedef   signed      char mt_int8_t;   /*  8位整形 */
typedef   signed short int mt_int16_t;  /* 16位整形 */
typedef   signed       int mt_int32_t;  /* 32位整形 */
typedef   signed long long mt_int64_t;  /* 64位整形 */
typedef unsigned      char mt_uint8_t;  /*  8无符号位整形 */
typedef unsigned short int mt_uint16_t; /* 16无符号位整形 */
typedef unsigned       int mt_uint32_t; /* 32无符号位整形 */
typedef unsigned long long mt_uint64_t; /* 64无符号位整形 */

/* 32bit CPU */
typedef mt_int32_t         mt_base_t;   /* 32位CPU基准有符号类型 */
typedef mt_uint32_t        mt_ubase_t;  /* 32位CPU基准无符号类型 */

typedef mt_base_t          mt_err_t;    /* 错误类型 */
typedef mt_ubase_t         mt_tick_t;   /* 时钟节拍类型 */
typedef mt_ubase_t         mt_size_t;   /* 大小类型 */
typedef mt_base_t          mt_ssize_t;  /* 大小类型 */
typedef mt_base_t          mt_off_t;    /* 偏移类型 */
typedef mt_base_t          mt_bool_t;   /* 布尔型 */

typedef void *(*mt_thread_func)(void *arg); /* 用户入口函数类型 */
typedef void (*mt_timer_func)(void *arg);   /* 定时器回调函数 */
typedef int (*mt_entry)(void);              /* 用户入口函数类型 */

/* BOOL值定义 */  
#define MT_TRUE   1 /* true  */
#define MT_FALSE  0 /* fals */

/* 基础数据类型的最大值 */
#define MT_UINT8_MAX    0xff
#define MT_UINT16_MAX   0xffff
#define MT_UINT32_MAX   0xffffffff
#define MT_TICK_MAX     MT_UINT32_MAX

/* 空指针定义 */
#define MT_NULL (0) 


/* 错误码定义 */
#define MT_EOK        0  /* 没有错误 */
#define MT_ERROR    (-1) /* 常规错误 */
#define MT_ETIMEOUT (-2) /* 超时 */
#define MT_EFULL    (-3) /* 资源满 */
#define MT_EEMPTY   (-4) /* 资源空 */
#define MT_ENOMEM   (-5) /* 分配内存失败 */
#define MT_ENOSYS   (-6) /* 系统不支持 */
#define MT_EBUSY    (-7) /* 忙 */
#define MT_EIO      (-8) /* I/O错误 */
#define MT_EINVAL   (-9) /* 无效参数 */


/* 编译器相关定义 */
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#define __CLANG_ARM
#endif

#if /* AC5 */defined(__CC_ARM) \
    /* AC6 */|| defined(__CLANG_ARM)
#include <stdarg.h>
#define MT_SECTION(x) __attribute__((section(x))) /* 指定变量/函数内存段 */
#define MT_UNUSED     __attribute__((unused))     /* 告诉编译器该变量、函数可能没使用 */
#define MT_USED       __attribute__((used))       /* 告诉编译器该变量、函数有使用 */
#define MT_ALIGN(n)   __attribute__((aligned(n))) /* 对齐 */                          
#define MT_WEAK       __attribute__((weak))       /* 弱定义 */
#define MT_INLINE     static __inline             /* 内联 */
#endif 
/**
 * 地址对齐
 * MT_ALIGN_UP(13, 4) = 16
 */
#define MT_ALIGN_UP(size, align) (((size) + (align) - 1) & ~((align) - 1))

/**
 * 地址对齐
 * MT_ALIGN_DOWN(13, 4) = 12
 */
#define MT_ALIGN_DOWN(size, align) ((size) & ~((align) - 1))
/**
 * 根据成员地址、结构体类型、成员名查找对应结构体地址
 */
#define mt_container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))

/**
 * 双向链表节点
 */
struct list_node{
    struct list_node *prev; /* 指向上一个节点 */
    struct list_node *next; /* 指向下一个节点 */
};
typedef struct list_node mt_list_t;

/**
 * 内核对象
 */
typedef struct
{
    mt_list_t list;              /* 对象链表节点 */
    mt_uint8_t type;              /* 对象类型 */
    char      name[MT_NAME_MAX]; /* 对象名称 */
}mt_object_t;

/**
 * 内核对象容器
 */
typedef struct
{
    volatile mt_uint8_t type; /* 对象类型 */
    mt_list_t object_list;   /* 对象链表头 */
    mt_size_t object_size;   /* 对象大小 */
}mt_object_container_t;

/**
 * 定时器构体
 */
typedef struct{
    mt_object_t   parent;       /* 继承的内核对象 */

    mt_uint8_t    flag;         /* 定时器状态/属性标志 */
    mt_list_t     list;         /* 定时器链表节点 */

    mt_timer_func callbk;       /* 定时器超时回调函数 */
    void          *parameter;   /* 回调函数参数 */

    mt_tick_t     timeout_tick; /* 超时时间戳 */
    mt_tick_t     target_tick;  /* 目标时间戳 */
}mt_timer_t;

/**
 * 线程结构体
 */
typedef struct{
    mt_object_t    parent;           /* 继承的内核对象 */

    mt_list_t      list;             /* 线程链表节点 */

    mt_ubase_t     sp;               /* 缓存SP寄存器的值 */
    mt_thread_func entry;            /* 线程函数 */
    void           *parameter;       /* 线程参数 */
    void           *stack_addr;      /* 线程堆栈地址 */
    mt_uint32_t    stack_size;       /* 线程堆栈大小 */

    mt_err_t       error;            /* 线程错误码 */
    mt_uint8_t     stat;             /* 线程状态 */

    mt_uint8_t     current_priority; /* 当前优先级 */

#if MT_THREAD_PRIORITY_MAX > 32
    mt_uint8_t     index;            /* 二级映射表索引 */
    mt_uint8_t     high_mask;        /* 二级压映射表掩码 */
#endif
    mt_uint32_t    index_mask;       /* 一级映射表掩码 */

    mt_ubase_t     init_tick;        /* 初始时间戳 */
    mt_ubase_t     remaining_tick;   /* 剩余时间戳 */

    mt_timer_t     timer;            /* 线程内置定时器 */

    mt_uint32_t    event_mask;       /* 线程要等待的事件集 */
    mt_uint8_t     event_flag;       /* 事件集的等待方式 */
#ifdef MT_ENABLE_STATS
    mt_ubase_t     old_cpu_tick;
    mt_uint64_t    run_time;
#endif
}mt_thread_t;

/**
 * IPC对象
 */
typedef struct{
    mt_object_t parent;       /* 继承的内核对象 */
    mt_list_t   suspend_list; /* 挂起列表 */
    mt_uint8_t  flags;        /* IPC属性 */
}mt_ipc_object_t;

/**
 * 信号量
 */
typedef struct{
    mt_ipc_object_t parent;       /* 继承的IPC对象 */
    
    mt_uint32_t     value;        /* 信号量当前值 */
    mt_uint32_t     permit_value; /* 信号量允许的最大值 */
}mt_sem_t;

/**
 * 互斥量结构体
 */
typedef struct{
    mt_ipc_object_t parent;             /* 继承于IPC对象 */
    
    mt_bool_t       idle_flag;          /* 互斥量空闲标志 */
    mt_uint32_t     nest;               /* 嵌套计数 */
    
    mt_thread_t     *owner_thread;      /* 当前所属线程 */
    mt_uint8_t      original_priority;  /* 当前所属线程的原始优先级 */
}mt_mutex_t;

/**
 * 消息队列结构体
 */
typedef struct{
    mt_ipc_object_t parent;         /* 继承于IPC对象 */
    
    void            *msg_pool;      /* 消息池地址 */
    mt_size_t       pool_quantity;  /* 消息池的个数 */
    mt_size_t       max_size;       /* 每条消息的最大大小 */
    
    mt_list_t       free_list;      /* 空闲消息池 */
    mt_list_t       msg_list;       /* 消息链表 */
    mt_size_t       msg_cnt;        /* 当前消息条数 */
}mt_mq_t;

/**
 * 消息头
 */
typedef struct{
    mt_list_t       list;      /* 链表节点 */
    mt_size_t       size;      /* 当前消息的大小 */
}mt_msg_head_t;

/**
 * 事件集结构体
 */
typedef struct{
    mt_ipc_object_t parent;         /* 继承于IPC对象 */
    mt_uint32_t     event_set;      /* 事件集当前值 */
}mt_event_t;

/**
 * FIFO结构体
 */
typedef struct{
    mt_ipc_object_t parent;           /* 继承于IPC对象 */
    void            *pool;            /* FIFO内存地址 */
    mt_size_t       element_quantity; /* 元素个数 */
    mt_size_t       element_size;     /* 元素大小 */
    
    mt_size_t       r_index;          /* FIFO读索引 */
    mt_size_t       w_index;          /* FIFO写索引 */
    
    mt_bool_t       is_empty;         /* FIFO空标识(当r_index和w_index相等时，为MT_TRUE表示FIFO空，为MT_FALSE表示FIFO满) */
}mt_fifo_t;

/**
 * 内存堆节点
 */
typedef struct{
    mt_uint16_t magic;  /* 幻术 */
    mt_uint16_t used;   /* 是否被使用，0：未使用，1：已使用 */
    mt_size_t   n_size; /* 当前节点的大小，包括当前节点数据结构所占空间 */
    mt_size_t   p_size; /* 上一个节点的大小，包括上一个节点数据结构所占空间 */
}mt_heap_node_t;

/**
 * 内存堆结构体
 */
typedef struct{
    mt_object_t parent;      /* 继承的内核对象 */

    mt_size_t   heap_size;   /* 内存堆大小 */
    mt_uint8_t  *first_node; /* 内存堆第一个节点 */
    mt_uint8_t  *first_free; /* 第一个可能空闲的内存堆节点的地址 */
    mt_uint8_t  *last_node;  /* 最后一个内存堆节点的地址 */
    mt_sem_t    lock;        /* 互斥信号量 */
}mt_heap_t;

/**
 * 设备操作函数集合
 */
struct mt_device;
typedef struct{
    mt_err_t (*init)(struct mt_device *device);
    mt_err_t (*open)(struct mt_device *device, mt_uint32_t flags);
    mt_err_t (*close)(struct mt_device *device);

    mt_err_t (*ioctl)(struct mt_device *device, mt_uint32_t cmd, void *arg);
    mt_ssize_t (*pread)(struct mt_device *device, void *buffer, mt_size_t size, mt_uint32_t pos);
    mt_ssize_t (*pwrite)(struct mt_device *device, const void *buffer, mt_size_t size, mt_uint32_t pos);
}mt_device_ops_t;

/**
 * 设备对象结构体结构体
 */
typedef struct mt_device{
    mt_object_t        parent;          /* 继承的内核对象 */
    
    mt_uint32_t        magic;           /* 设备幻数 */
    mt_uint32_t        flags;           /* 设备支持的打开方式 */
    mt_device_ops_t    *ops;            /* 设备操作函数集合 */
    void               *driver_private; /* 驱动私有数据 */
    
    mt_uint32_t        count;           /* 设备引用计数 */
    mt_uint32_t        oflags;          /* 设备当前打开方式 */
#ifdef ENABLE_DEVICE_LOCK
    mt_sem_t           lock;            /* 互斥信号量 */
#endif
}mt_device_t;

#ifdef __cplusplus
}
#endif

#endif
